const path = require("path");
const express = require("express");
const formidable = require("formidable");
const adminListC = require("./Db/collections/adminList");
const advListC = require("./Db/collections/advList")
const {getMd5, getNowTime, jwtEncode, jwtDecode} = require("./utils");
const {author} = require("./middleware");
const app = express();
app.use(express.json());// 接收请求体格式为application/json的数据
// 将指定的目录作为静态资源目录
app.use(express.static(path.resolve(__dirname,"./upload")))
// 完成添加管理员接口
app.post("/admin",author(),async (req,res,next)=>{
	try{
		// 1- 接收请求体的数据
		// 2- 验证管理员账号是否存在
		//    2-1- 存在：给予响应----》管理员的名字已经存在，请不要重复提交
		//    2-2- 不存在：添加管理-----》添加成功
		const {adminName,password} =req.body;
		// 获取与接收的管理员账号的名字相同的条数
		const count = await adminListC.count({adminName});
		if(count>0){
			res.json({
				ok:-1,
				msg:"管理员的名字已经存在，请不要重复提交"
			});
			return;
		}
		await adminListC.insertOne({
			adminName,
			password:getMd5(password),
			loginTime:getNowTime(),
			regTime:getNowTime()
		});
		res.json({
			ok:1,
			msg:"添加管理员成功"
		})
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}


});
// 获取管理员列表接口
app.get("/adminList",author(),async (req,res)=>{
	try{
		const adminList = await adminListC.find({
			sortObj:{
				regTime:-1
			}
		});
		res.json({
			ok:1,
			msg:"获取成功",
			adminList
		})
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
})

// 登陆接口
app.post("/login",async (req,res)=>{
	try{
		// 1- 接收数据
		const {adminName,password} = req.body;
		// 2- 验证数据
		const info = await adminListC.findOne({
			adminName,
			password:getMd5(password)
		})
		// 3- 给予响应
		if(info){
			res.json({
				ok:1,
				msg:"登陆成功",
				token:jwtEncode({
					adminName,
					adminId:info._id
				})
			})
		}else{
			res.json({
				ok:-1,
				msg:"账号或密码错误,请重新输入！"
			})
		}
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
});

// 广告添加的接口
app.post("/adv",author(),async (req,res)=>{
	try{
		// 1- 下载 cnpm i formidable
		// 2- 引入并使用
		const form = new formidable.IncomingForm({
			// 1- 指定存储图片的目录
			uploadDir:path.resolve(__dirname,"./upload"),
			// 2- 保留图片的扩展名
			keepExtensions:true
		});
		// params:非图片信息
		// file:图片信息
		const [params,file] = await form.parse(req);

		// 将收集的数据放置到数据库
		await advListC.insertOne({
			advTitle:params.advTitle[0],
			advHref:params.advHref[0],
			advOrder:params.advOrder[0]/1,
			advType:params.advType[0]/1,
			advPic:file.advPic[0].newFilename,
			addTime:getNowTime(),
			upTime:getNowTime()
		})
		res.json({
			ok:1,
			msg:"添加广告成功"
		})
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
});
// 获取广告列表
app.get("/advList",author(),async(req,res)=>{
	try{
		let {pageNo=1,pageSize=2,keyword} = req.query;
		pageNo = pageNo/1;
		pageSize = pageSize/1;
		const whereObj = {};
		if(keyword){
			whereObj.advTitle = new RegExp(keyword);
		}
		// 总页数
		const count = await advListC.count(whereObj);
		let  pageSum = Math.ceil(count/pageSize);
		if(pageSum<1) pageSum = 1;
		if(pageNo>pageSum) pageNo = pageSum;
		if(pageNo<1) pageNo = 1;

		const advList = await advListC.find({
			whereObj,
			sortObj:{
				addTime:-1
			},
			limit:pageSize,
			skip:(pageNo-1)*pageSize
		});
		res.json({
			ok:1,
			msg:"获取成功",
			advList,
			pageSum,
			pageNo
		})
	}catch (err){
		res.json({
			ok:-1,
			msg:err.message
		})
	}
})


app.listen(8091,()=>{
	console.log("success")
})